<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>1_类的基本知识</title>
</head>

<body>
    <div id="root"></div>
    <script type=text/javascript>
        //创建一个Person类
        /*
        类的语法：总结
        1.类中的构造器方法，constructor()不是必须写的,要对实例进行一些初始化的操作,就可以写
        2. 如果A类继承了B类，那么A类的构造器中，必须先调用super()
        3. 在类中定义的方法,都放在类的原型对象上，供实例使用
        */
        class Person {
            //构造器方法
            constructor(name,age){
                //构造器中的this是谁？— 一类的实例对象
                this.name = name
                this.age = age
            }
            //一般方法
            speak(){
                //speak方法放在了哪里？—一类的原型对象上，供实例使用
                //speak中的this就是Person实例
                console.log(`我叫${this.name}，我年龄是${this.age}`);
            }
        }

        // 创建一个Student类,继承Person, 如果有独有的属性，就放在构造器中
        // 让子类也可以使用父类原型上的方法，例如 speak() 方法
        class Student extends Person{
            constructor(name,age,grade){
                super(name,age)
                this.grade = grade
            } 
            demo(){}
        }

        //创建一个Person的实例对象
        const p1 = new Person('tom',18)
        const p2 = new Person('jerry',19)
        const s1 = new Student('jack',20,1)
        s1.speak();
        console.log('@@', s1);
        
        console.log(p1);
        console.log(p2);
        p1.speak()
        p2.speak()
        p1.speak.call({a:1,b:2})
        </script>
</body>

</html>